package com.youboy.wechatapi.service.api;

import java.util.Calendar;
import java.util.Date;

import net.sf.json.JSONException;
import net.sf.json.JSONObject;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.youboy.wechatapi.domain.pojo.AccessToken;
import com.youboy.wechatapi.utils.http.HttpClient;

/**
 * @ProjectName：wechatapi   
 * @author：冉尧（Yvan）
 * @CreateTime：2014年9月29日 上午11:14:30  
 * @Remarks： Service for Token
 */
@Service
public class TokenService {
	
	private Logger log = Logger.getLogger(TokenService.class);
	
	/**
	 * 全局Token对象
	 */
	public static AccessToken accessToken;
	
	public static Date updateTime;

	// 开发者ID
	@Value(value="${api.appid}")
	private String appid;
	@Value(value="${api.secret}")
	private String secret;
	
	// 获取access_token的接口地址（GET） 限200（次/天）   
	@Value(value="${api.access.token}")
	private String access_token_url;
	
	/**
	 * 获取token
	 * @param isForce 是否忽略有效时间进行强行获取
	 * @return 获取到的Token对象
	 */
	public AccessToken getAccessToken(boolean isForce) {
		
		//是否进行获取Token
		boolean isGet = false;
		
		if(isForce){
			isGet = true;
		} else {
			if (null == accessToken) {
				 isGet = true;
			} else {
				Calendar c = Calendar.getInstance();
				c.setTime(updateTime);
				c.add(Calendar.MINUTE, accessToken.getExpiresIn()/60);
				Date afterTime = c.getTime();
				
				if(afterTime.getTime()>=new Date().getTime()){
					isGet = true;
				}
			}
		}
		
		if (isGet) {
			Date now = new Date();
			String requestUrl = access_token_url.replace("APPID", appid).replace("APPSECRET", secret);  
		    JSONObject jsonObject = HttpClient.getJsonObject(requestUrl, null);  
		    // 如果请求成功   
		    if (null != jsonObject) {  
		        try {  
		            accessToken = new AccessToken();  
		            accessToken.setToken(jsonObject.getString("access_token"));  
		            accessToken.setExpiresIn(jsonObject.getInt("expires_in"));
		            updateTime = now;
		        } catch (JSONException e) {  
		            accessToken = null;  
		            // 获取token失败   
		            log.error("获取token失败 errcode:{"+jsonObject.getInt("errcode")+"} errmsg:{}"+jsonObject.getString("errmsg"));  
		        }  
		    }  
		}
		
	    return accessToken;  
	}
		
}

